#include <iostream>
#include <string>
using namespace std;

void TestString1()
{
	string s1;
	cin >> s1;
	cout << "s1:"<<s1 << endl;

	string s2("123456");
	cout << "s2:" << s2 << endl;
	string s3(s2);
	cout << "s3:" << s3 << endl;
	string s4("123456", 5);//赋前五个字符
	cout << "s4:" << s4 << endl;
	string s5(10, 's');//赋10个字符's';
	cout << "s5:" << s5 << endl;
}


void TestString2()  // 容量相关
{
	string s("hello");
	cout << s.size() << endl; // 一般用size比较多一些，查看有效元素个数
	cout << s.length() << endl;
	cout << s.capacity() << endl; //看容量

	// s如果是空字符串 "" 返回true  否则返回false
	if (!s.empty())
	{
		cout << s << endl;
	}

	s.clear();
	if (s.empty())
	{
		cout << "空字符串" << endl;
	}
}

// reserve: 扩容，不会改变有效元素的个数
// reserve(size_t newcapacity)
// 假设当前扩容的string对象底层旧容量为 oldcapacity
// newcapacity > oldcapacity：reserve方法才会真正扩容（vs下：1.5倍扩容）
// newcapacity < oldcapacity
//   newcapacity >= 16: reserve不会将空间缩小的
//   newcapacity <= 15: reserve才会将空间缩小--15

void TestString3()
{
	string s("hello");
	//是 reserve 不是 reverse

	s.reserve(20);  // 31
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	s.reserve(30);
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	s.reserve(40);   // 47
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	s.reserve(50);   // 70
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	s.reserve(60);   // 70
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	s.reserve(50);     // 70
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	s.reserve(40);   // 70
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	s.reserve(30);   // 70
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	s.reserve(20);   // 70
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	s.reserve(15);     // 15
	cout << s.size() << endl;
	cout << s.capacity() << endl;
}

void TestString4()
{
	/*
	char*
	size_t size
	size_t capacity
	总共占用12字节
	*/
	cout << sizeof(string) << endl; // 28字节的大小
}
//////////////////////////////////////////////////////////////

// void resize(size_t newsize, char ch) //增加
// void resize(size_t newsize)          //减少
// newsize: 将string对象中有效字符个数修改到newsize个
// ch: 如果是增多，多出的元素使用ch填充
// 将string对象中有效元素个数增加到newsize，多出的位置使用ch填充
// 注意：在增多的过程中可能会扩容
//       在减少的过程中容量不变
void TestString5()
{
	
	string s("hello");   // size:5  capacity:15
	s.resize(10, '!');   // size:10  capacity:15
	s.resize(20, '$');   // size:20  capacity:31
	s.resize(30, '%');   // size:30  capacity:31
	s.resize(20, '8');
	s.resize(8);
	s.resize(3);

}

void TestString6()
{
	/*
	1. 可以知道string内部的扩容机制
	2. 如果大概知道要往string中放多少个元素，在push_back之前
	   可以提前先将容量给好，否则一边插入一边扩容效率非常低
	*/
	string s;
	// s.reserve(100);
	size_t cap = s.capacity();
	
	//void push_back(char c);
	for (size_t i = 0; i < 100; ++i)
	{
		s.push_back('A');
		if (cap != s.capacity())
		{
			cap = s.capacity();
			cout << cap << endl;
		}
	}
}

#include <assert.h>
void TestString7()
{
	string s("hello");
	
	cout << s[0] << endl;
	s[0] = 'H';
	cout << s << endl;

	cout << s.at(0) << endl;
	s.at(0) = 'h';
	cout << s << endl;

	// cout << s[100] << endl;    // []越界：assert
	cout << s.at(100) << endl; // at越界：exception: std::out_of_range 
}

void TestString8()
{
	string s("hello");
	s += ' ';
	s += "world";

	string ss("!!!");
	s += ss;

	s.append(10, 'A');
	s.clear();
	s.append("abcd");
	s.append("1234",2);
}
void TestString9()
{
	string s("world");
	//string& insert(size_t pos, const char* s);
	// iterator insert (iterator p, char c);
	s.insert(s.begin(), ' ');
	//s.insert(0, " ");
	
	s.insert(0, "hello");
	s.insert(s.end(), 'n');
}
void TestString10()
{
	string s("11122233333333333334444");
	s.erase(0, 3);//string& erase (size_t pos = 0, size_t len = npos);从位置0开始删除，删除三个
	s.erase(s.begin() + s.find('3'), s.begin() + s.rfind('3') + 1);//左闭右开
	// iterator erase (iterator first, iterator last);
	//s.erase(s.begin() + s.find('3'),s.end());
}

// 获取一个文件的后缀
void TestString11()
{
	string filename("1.t22111.txt");
	
	cout << filename.substr(filename.rfind('.') + 1) << endl;
	// string substr (size_t pos = 0, size_t len = npos) const;
}

// 一行单词，单词和单词之间使用空格隔开，最后一个单词的长度
void TestString12()
{
	string words;
	// cin >> words;
	while (getline(cin, words))
	{
		//cout << words.substr(words.rfind(" ") + 1).size() << endl;
		cout << words.substr(words.rfind(' ') + 1).size() << endl;
	}
}

void TestString13()
{
	string s("hello world");
	string s1(s);
	s.c_str();
	if (s.c_str() == s1.c_str())
	{
		cout << s.c_str()<< endl;
		cout << s1.c_str() << endl;
	}
	printf("%p\n", s.c_str());
	printf("%p\n", s1.c_str());
	
}
void TestString14()
{
	int array[] = { 1, 2, 3 };
	

	string s("hello");
	// 借助下标+[]
	for (size_t i = 0; i < s.size(); ++i)
	{
		cout << s[i];  // char& operator[](size_t index)
	}
	cout << endl;

	// 范围for
	for (auto e : s)
		cout << e;
	cout << endl;

	// 使用正向迭代器
	string::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it;
		++it;
	}
	cout << endl;

	// 使用反向迭代器

	// string::reverse_iterator rit = s.rbegin();
	auto rit = s.rbegin();
	// auto a = 10;  int a = 10;
	while (rit != s.rend())
	{
		cout << *rit;
		++rit;
	}
	cout << endl;

	reverse(s.begin(), s.end());
}

// https:\www.baidu.com\index.html
void TestString15()
{
	string s("https:/www.baidu.com/index.html");
	cout << s.find("www") << endl;
	cout << s.find("com") << endl;

	size_t pos = s.find("www");
	size_t end = s.find("com");
	

	if (end != string::npos)
	{
		cout << s.substr(pos, end + 3 - pos) << endl;
	}
	else
	{
		cout << "com不存在" << endl;
	}}

void TestString16()
{
	string s("1234");
	int value = atoi(s.c_str());//atoi  是让  字符串 变为 int 类型
	cout << value << endl;
}

// oj: 给一个单词，返回该单词的长度
void TestString17()
{
	// 一次性接收一个字符串---cin在接收字符串时遇到空格  回车等空白字符停止接收
	//string word;
	//while (cin >> word)
	//{
	//	cout << word.size() << endl;
	//}

	// 一次性要接收一行
	string words;
	while (getline(cin, words))
	{
		cout <<"words:" << words << endl;
		cout << words.substr(words.rfind(" ")+1).size() << endl;
	}
}

#include <algorithm> // sort 的头文件

void TestString18()
{
	string s1("hello");
	string s2("World");
	if (s1 < s2) // 比较的是字符串首字符的ASCII值大小，首字符相等，比较后面的那个字符
	{
		cout << "s1 < s2" << endl;
	}
	else
	{
		cout << "s1 >= s2" << endl;
	}
	
	string ss[] = { "hello", "world", "bit", "aaa" };
	sort(ss, ss + sizeof(ss) / sizeof(string));//默认升序
	
}


void Testisalpha()
{
	cout << isalpha('A') << endl;//isalpha();检查字符是否为字母 , 打印 1
	cout << isalpha('-') << endl;//打印 0
}



//int main()
//{
//	
//	//TestString1();
//	//TestString2();
//	//TestString3();
//	//TestString4();
//	//TestString5();
//	//TestString6();
//	//TestString7();
//	//TestString8();
//	
//	//TestString9();
//	//TestString10();
//	//TestString11();
//	//TestString13();
//	//TestString14();
//	//TestString15();
//	//TestString16();
//	//TestString17();
//	//TestString18();
//	Testisalpha();
//
//	return 0;
//}

int main()
{
	 
	string strText = "How are you?";

	string strSeparator = " ";

	string strResult;

	size_t size_pos = 0;//4----7---8

	size_t size_prev_pos = 0;//4-----8

	while ((size_pos = strText.find_first_of(strSeparator, size_pos)) != string::npos)//12

	{

		strResult = strText.substr(size_prev_pos, size_pos - size_prev_pos);

		cout << strResult << " "; // How are

		size_prev_pos = ++size_pos;

	}

	if (size_prev_pos != strText.size())

	{

		strResult = strText.substr(size_prev_pos, size_pos - size_prev_pos);

		cout << strResult << " ";

	}

	cout << endl;

	return 0;

}